﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gustozzi.DAL;

namespace Gustozzi.BL
{
    public class PedidoBL
    {

        public const string cPedido_Pendiente="Pendiente";
        public const string cPedido_Anulado="Anulado";
        public const string cPedido_Observado="Observado";//Cuando se modifica el pedido
        public const string cPedido_Facturado = "Facturado";


        public int ActualizaPedido(Pedido oPedido, List<ItemPedido> lstItemsPedido, VentasDataEntities contexto)
        {
            try
            {
                if(contexto==null)
                {
                    contexto=new VentasDataEntities();
                }
                                
                double montoAntesImpuestos = 0;
                double montoDespuesImpuestos = 0;
                double montoIGV = 0;
                double igv=0;

                var listaIGV = from p in contexto.ListadoIGV
                               where p.estado==1
                               select p.porcentaje;
                
                if (listaIGV.Count() > 0) 
                {
                    igv = (double)listaIGV.First();
                }

                
                var lstPedido = (from p in contexto.Pedidos
                                 where p.codigoPedido==oPedido.codigoPedido 
                                                select p);
                int codigoPedido = 1;

                if (lstPedido.Count() <= 0)
                {
                    var listaMaxPedido = (from p in contexto.Pedidos
                                          select p.codigoPedido);
                    if (listaMaxPedido.Count() > 0)
                    {
                        codigoPedido = listaMaxPedido.Max();
                        codigoPedido += 1;
                        oPedido.codigoPedido = codigoPedido;
                    }
                    else
                    {
                        oPedido.estado = cPedido_Observado;
                    }
                }
                else 
                {
                    oPedido = lstPedido.First();
                }

                int codigoDetallePedido = 0;
                if (lstItemsPedido != null)
                {
                    int codigoDetalleItem=1;
                    foreach (ItemPedido item in lstItemsPedido)
                    {
                        var lstDetallePedido = from i in contexto.PedidoItems
                                                       where i.codigoPedido==oPedido.codigoPedido
                                                       && i.codigoPedidoDetalle==item.codigoPedidoDetalle
                                                       select i;

                        PedidoItem oPedidoItem = null;
                        if (lstDetallePedido.Count() > 0)
                        {
                            oPedidoItem = lstDetallePedido.First();
                        }
                        else 
                        {
                            oPedidoItem = new PedidoItem();
                            oPedidoItem.codigoPedido = oPedido.codigoPedido;
                            var lstDetalleMax = from i in contexto.PedidoItems
                                                where i.codigoPedido==oPedido.codigoPedido 
                                                select i.codigoPedido;


                            if (lstDetalleMax.Count() > 0)
                            {
                                codigoDetallePedido = lstDetalleMax.Max();
                               
                            }
                            codigoDetallePedido++;
                            oPedidoItem.codigoPedidoDetalle = codigoDetallePedido;
                            oPedido.estado = cPedido_Pendiente;
                            contexto.AddToPedidoItems(oPedidoItem);
                        }

                        if (igv > 0)
                        {                           
                            double montoItem = item.importe / (1 + igv / 100);
                            montoItem = Math.Round(montoItem, 2);
                            double montoNetoItem = Math.Round(item.importe, 2);
                            double montoIGVItem = Math.Round(montoNetoItem - montoItem, 2);

                            montoAntesImpuestos += montoItem;
                            montoIGV += montoIGVItem;
                            montoDespuesImpuestos += montoNetoItem;

                            codigoDetalleItem += 1;
                            oPedidoItem.cantidad = item.cantidad;
                            oPedidoItem.codigoProducto = item.codigoProducto;
                            if (item.codigoProducto == 0)
                            {
                                oPedidoItem.codigoProducto = null;
                            }
                            oPedidoItem.codigoPromocion = item.codigoPromocion;
                            if (item.codigoPromocion == 0)
                            {
                                oPedidoItem.codigoPromocion = null;
                            }
                            oPedidoItem.importe = item.importe;
                            oPedidoItem.precioUnitario = item.precioUnitario;
                        }
                    }
                }

                oPedido.montoNeto = montoAntesImpuestos;
                oPedido.montoImpuestos = montoIGV;
                oPedido.montoTotal = montoDespuesImpuestos;
                
                return contexto.SaveChanges();
                
            }
            catch (Exception)
            {
                throw;
            }
        }

        public bool anulaPedido(int codigoPedido) 
        {
            if (codigoPedido > 0) 
            {
                VentasDataEntities contexto = new VentasDataEntities();
                
                var lstPedidos= (from p in contexto.Pedidos 
                                         where p.codigoPedido==codigoPedido 
                                         select p);
                if (lstPedidos.Count()<=0)
                {
                    throw new Exception("No se ha encontrado el pedido");
                }
                else 
                {
                    Pedido oPedido = lstPedidos.First();
                    if (oPedido.estado == PedidoBL.cPedido_Anulado)
                    {
                        throw new Exception("No se puede anular un pedido ya anulado");
                    }
                    else 
                    {
                        oPedido.estado = PedidoBL.cPedido_Anulado;
                        int actualizado=contexto.SaveChanges();
                        if (actualizado > 0)
                            return true;
                    }
                }

            }
            return false;
        }
    }
}
